package br.ufal.ic.p3.darv10.banco;

import java.util.ArrayList;
import java.util.List;

import br.ufal.ic.p3.darv10.dominio.*;
import br.ufal.ic.p3.darv10.excecao.DARExcecao;

public class Banco {

	private static Banco bd;
	private List<Secretaria> bdSecretaria = new ArrayList<Secretaria>();
	private List<Departamento> bdDepartamentos = new ArrayList<Departamento>();
	private List<Curso> bdCursos = new ArrayList<Curso>();
	private List<Professor> bdProfessor = new ArrayList<Professor>();
	private List<Aluno> bdAlunos = new ArrayList<Aluno>();
	private List<Disciplina> bdDisciplinas = new ArrayList<Disciplina>();

	public static Banco getInstance() throws DARExcecao {
		if(bd == null){
			bd = new Banco();
		}
		return bd;
	}

	private Banco() throws DARExcecao{

		//Criação: Universidade
		Universidade ufal = new Universidade("UFAL");

		//Criação: Secretarias
		Secretaria secGradInfo = new SecretariaGraduacao("Secretaria - Engenharia da Computação - Graduação"); 
		Secretaria secGradLetras = new SecretariaGraduacao("Secretaria - Letras - Graduação");
		Secretaria secPosInfo = new SecretariaPosGraduacao("Secretaria - Informática - Pós-Graduação");

		//Criação: Departamentos
		Departamento depInfo = new Departamento("Informática");
		Departamento depLetras = new Departamento("Letras");

		//Criação: Cursos
		Curso engComputacao = new Curso("Engenharia da Computação",true);
		Curso bacharelado = new Curso("Bacharelado", true);
		Curso doutInformatica = new Curso("Doutorado - Informática", false);
		Curso portIngles = new Curso("Português - Inglês", true);

		//Criação: Disciplinas
		Disciplina labProg = new Disciplina("Laboratório de Programação I", "INF 1622", 70, true, true, 0, true);
		Disciplina estDados = new Disciplina("Estrutura de Dados", "INF 1620", 60, true, false, 0, true);
		Disciplina projSSoft = new Disciplina("Projeto de Sistema de Software I", "INF 1624", 40, false, true, 0, true);
		Disciplina progPGrande = new Disciplina("Programação em ponto grande", "INF 1628", 50, false, true, 0, true);
		Disciplina introCComp = new Disciplina("Introdução a Ciência da Computação", "INF 1001", 40, true, true, 0, true);
		Disciplina calcNum = new Disciplina("Cálculo Numérico", "INF 1002", 40, true, true, 100, true);
		Disciplina softBas = new Disciplina("Software Básico", "INF 1600", 50, false, true, 40, true);

		Disciplina hipAdapt = new Disciplina("Hipermídia Adaptativa", "INF 1303", 30, false, true, 0, false);

		Disciplina ingles1 = new Disciplina("Inglês I", "LET 1501", 30, true, true, 0, true);

		//Criação: Professores
		Professor arndtVonStaa  = new Professor("Arndt Von Staa");
		Professor marcusPoggi   = new Professor("Marcus Poggi");
		Professor carlosLucena  = new Professor("Carlos Lucena");
		Professor brunoFeijo    = new Professor("Bruno Feijó");
		Professor danielSchawbe = new Professor("Daniel Schawbe");
		Professor angelaSouza   = new Professor("Ângela Souza");

		//Criação: Alunos
		Aluno alexCarvalho    = new Aluno("Alex Carvalho", "98124812", 130, 50);
		Aluno juremaTorres    = new Aluno("Jurema Torres", "9924812", 100, 0);
		Aluno joseVasconcelos = new Aluno("José Vasconcelos", "9915918", 0, 0);
		Aluno joaoSilva       = new Aluno("João da Silva", "9914918", 0, 0);
		Aluno mariaAntonia    = new Aluno("Maria Antônia", "0012398", 0, 0);

		//Relacionamento: Universidade - Departamento
		ufal.adicionarDepartamento(depLetras);
		ufal.adicionarDepartamento(depInfo);
		
		
		//Relacionamento: Secretaria - Departamento | Departamento - Secretaria
		depInfo.adicionarSecretaria(secGradInfo);
		depInfo.adicionarSecretaria(secPosInfo);
		depLetras.adicionarSecretaria(secGradLetras);
		
		secGradInfo.setDepartamento(depInfo);
		secPosInfo.setDepartamento(depInfo);
		secGradLetras.setDepartamento(depLetras);
		
		//Relacionamento: Secretaria - Curso | Curso - Secretaria
		secGradInfo.adicionarCurso(bacharelado);
		secGradInfo.adicionarCurso(engComputacao);
		secGradLetras.adicionarCurso(portIngles);
		secPosInfo.adicionarCurso(doutInformatica);
		
		bacharelado.setSecretaria(secGradInfo);
		engComputacao.setSecretaria(secGradInfo);
		portIngles.setSecretaria(secGradLetras);
		doutInformatica.setSecretaria(secPosInfo);
		
		//Relacionamento: Departamento - Disciplina
		depInfo.adicionarDisciplina(labProg);
		depInfo.adicionarDisciplina(estDados);
		depInfo.adicionarDisciplina(projSSoft);
		depInfo.adicionarDisciplina(progPGrande);
		depInfo.adicionarDisciplina(introCComp);
		depInfo.adicionarDisciplina(calcNum);
		depInfo.adicionarDisciplina(softBas);
		depInfo.adicionarDisciplina(hipAdapt);
		
		depLetras.adicionarDisciplina(ingles1);

		//Relacionamento: Curso - Disciplina | Disciplina - Curso
		engComputacao.adicionarDisciplina(labProg);
		engComputacao.adicionarDisciplina(estDados);
		engComputacao.adicionarDisciplina(projSSoft);
		engComputacao.adicionarDisciplina(progPGrande);

		bacharelado.adicionarDisciplina(introCComp);
		bacharelado.adicionarDisciplina(calcNum);
		bacharelado.adicionarDisciplina(softBas);

		doutInformatica.adicionarDisciplina(hipAdapt);

		portIngles.adicionarDisciplina(ingles1);
		
		labProg.setCurso(engComputacao);
		estDados.setCurso(engComputacao);
		projSSoft.setCurso(engComputacao);
		progPGrande.setCurso(engComputacao);
		
		introCComp.setCurso(bacharelado);
		calcNum.setCurso(bacharelado);
		softBas.setCurso(bacharelado);
		
		hipAdapt.setCurso(doutInformatica);
		
		ingles1.setCurso(portIngles);

		//Relacionamento: Disciplina - Professor
		labProg.setProfessorDisciplina(arndtVonStaa);
		estDados.setProfessorDisciplina(marcusPoggi);
		projSSoft.setProfessorDisciplina(carlosLucena);
		progPGrande.setProfessorDisciplina(arndtVonStaa);

		introCComp.setProfessorDisciplina(brunoFeijo);
		calcNum.setProfessorDisciplina(marcusPoggi);
		softBas.setProfessorDisciplina(arndtVonStaa);

		hipAdapt.setProfessorDisciplina(danielSchawbe);

		ingles1.setProfessorDisciplina(angelaSouza);

		//Relacionamento: Professor - Disciplina
		arndtVonStaa.adicionarDisciplina(labProg);
		arndtVonStaa.adicionarDisciplina(softBas);
		arndtVonStaa.adicionarDisciplina(progPGrande);

		marcusPoggi.adicionarDisciplina(calcNum);
		marcusPoggi.adicionarDisciplina(estDados);

		carlosLucena.adicionarDisciplina(projSSoft);

		brunoFeijo.adicionarDisciplina(introCComp);

		danielSchawbe.adicionarDisciplina(hipAdapt);

		angelaSouza.adicionarDisciplina(ingles1);

		//Relacionamento: Curso - Aluno | Aluno - Curso
		engComputacao.adicionarAluno(alexCarvalho);
		engComputacao.adicionarAluno(juremaTorres);
		bacharelado.adicionarAluno(joseVasconcelos);
		doutInformatica.adicionarAluno(joaoSilva);
		portIngles.adicionarAluno(mariaAntonia);

		alexCarvalho.adicionarCurso(engComputacao);
		juremaTorres.adicionarCurso(engComputacao);
		joseVasconcelos.adicionarCurso(bacharelado);
		joaoSilva.adicionarCurso(doutInformatica);
		mariaAntonia.adicionarCurso(portIngles);

		//Relacionamento: Disciplina - Aluno | Aluno - Disciplina
		labProg.matricularAluno(alexCarvalho);
		labProg.matricularAluno(juremaTorres);

		alexCarvalho.adicionarDisciplinaJaCursada(labProg);
		juremaTorres.adicionarDisciplinaJaCursada(labProg);
		
		//Relacionamento: Secretaria - Disciplinas | Disciplinas - Secretaria
		secGradInfo.adicionarDisciplina(labProg);
		secGradInfo.adicionarDisciplina(estDados);
		secGradInfo.adicionarDisciplina(projSSoft);
		secGradInfo.adicionarDisciplina(progPGrande);
		secGradInfo.adicionarDisciplina(introCComp);
		secGradInfo.adicionarDisciplina(calcNum);
		secGradInfo.adicionarDisciplina(softBas);
		
		secPosInfo.adicionarDisciplina(hipAdapt);
		
		secGradLetras.adicionarDisciplina(ingles1);
		
		labProg.setSecretaria(secGradInfo);
		estDados.setSecretaria(secGradInfo);
		projSSoft.setSecretaria(secGradInfo);
		progPGrande.setSecretaria(secGradInfo);
		introCComp.setSecretaria(secGradInfo);
		calcNum.setSecretaria(secGradInfo);
		softBas.setSecretaria(secGradInfo);
		
		hipAdapt.setSecretaria(secPosInfo);
		
		ingles1.setSecretaria(secGradLetras);
		
		//Relacionamento: Disciplina - P.Requisitos
		labProg.adicionarPreReqDisciplina(estDados);
		projSSoft.adicionarPreReqDisciplina(estDados);
		projSSoft.adicionarPreReqDisciplina(progPGrande);
		
		
		//Adicionando na Lista
		
		bdDepartamentos.add(depInfo);
		bdDepartamentos.add(depLetras);
		
		bdSecretaria.add(secPosInfo);
		bdSecretaria.add(secGradLetras);
		bdSecretaria.add(secGradInfo);
		
		bdCursos.add(portIngles);
		bdCursos.add(bacharelado);
		bdCursos.add(engComputacao);
		bdCursos.add(doutInformatica);
		
		bdDisciplinas.add(ingles1);
		bdDisciplinas.add(progPGrande);
		bdDisciplinas.add(estDados);
		bdDisciplinas.add(hipAdapt);
		bdDisciplinas.add(softBas);
		bdDisciplinas.add(calcNum);
		bdDisciplinas.add(introCComp);
		bdDisciplinas.add(projSSoft);
		bdDisciplinas.add(labProg);
		
		bdProfessor.add(angelaSouza);
		bdProfessor.add(danielSchawbe);
		bdProfessor.add(brunoFeijo);
		bdProfessor.add(carlosLucena);
		bdProfessor.add(marcusPoggi);
		bdProfessor.add(arndtVonStaa);
		
		bdAlunos.add(joseVasconcelos);
		bdAlunos.add(juremaTorres);
		bdAlunos.add(alexCarvalho);
		bdAlunos.add(mariaAntonia);
		bdAlunos.add(joaoSilva);
	}
	
	public List<Aluno> getAlunos(){
		return bdAlunos;
	}
	
	public List<Secretaria> getSecretarias(){
		return bdSecretaria;
	}
	
	public List<Professor> getProfessores(){
		return bdProfessor;
	}
	
	public List<Departamento> getDepartamentos(){
		return bdDepartamentos;
	}
	
	public List<Curso> getCursos(){
		return bdCursos;
	}
	
	public List<Disciplina> getDisciplinas(){
		return bdDisciplinas;
	}
}
